package com.lanjiu.im.grpc.server.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author
 * @data 2021/6/17 16:46
 */
public class OSSUtil {

    static Logger logger = LoggerFactory.getLogger(OSSUtil.class);

    // endpoint是访问OSS的域名。如果您已经在OSS的控制台上 创建了Bucket，请在控制台上查看域名。
    // 如果您还没有创建Bucket，endpoint选择请参看文档中心的“开发人员指南 > 基本概念 > 访问域名”，
    // 链接地址是：https://help.aliyun.com/document_detail/oss/user_guide/oss_concept/endpoint.html?spm=5176.docoss/user_guide/endpoint_region
    // endpoint的格式形如“http://oss-cn-hangzhou.aliyuncs.com/”，注意http://后不带bucket名称，
    // 比如“http://bucket-name.oss-cn-hangzhou.aliyuncs.com”，是错误的endpoint，请去掉其中的“bucket-name”。
    private static String endpoint = "http://oss-cn-shanghai.aliyuncs.com";

    // accessKeyId和accessKeySecret是OSS的访问密钥，您可以在控制台上创建和查看，
    // 创建和查看访问密钥的链接地址是：https://ak-console.aliyun.com/#/。
    // 注意：accessKeyId和accessKeySecret前后都没有空格，从控制台复制时请检查并去除多余的空格。
    private static String accessKeyId = "LTAI4GBF1xb8o6TrF2myHDJw";
    private static String accessKeySecret = "Z27rqTk34XdVANwJBqZr6vNs7RbkL0";

    // Bucket用来管理所存储Object的存储空间，详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Bucket命名规范如下：只能包括小写字母，数字和短横线（-），必须以小写字母或者数字开头，长度必须在3-63字节之间。
    private static String bucketName = "wh-ress";

    private static String bucketChat = "bucket-chat";
    private static String bucketAvatar = "bucket-avatar";

    // Object是OSS存储数据的基本单元，称为OSS的对象，也被称为OSS的文件。详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Object命名规范如下：使用UTF-8编码，长度必须在1-1023字节之间，不能以“/”或者“\”字符开头。
    private static String firstKey = "my-first-key";

    //群成员头像本地缓存目录
    public static String groupAvatarDir = "D:\\file_server\\avatar\\";
    public static String compositeGroupAvatarDir = "D:\\file_server\\composite_avatar\\";

    public static String OSS_GROUP_AVATAR_DIR = "group_avatar";

    public OSS ossClient;

    public OSSUtil(){
        // 生成OSSClient，您可以指定一些参数，详见“SDK手册 > Java-SDK > 初始化”，
        // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/init.html?spm=5176.docoss/sdk/java-sdk/get-start
       ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
    /**
     * 判断OSS中是否存在指定文件,过滤不存在的图像地址
     * @return
     */
    public  List<String> existOSSUrl (List<String> urlList){
        if (!ossClient.doesBucketExist(bucketName)) {
            logger.error("您的Bucket不存在，创建Bucket：" + bucketName + "。");
            ossClient.createBucket(bucketName);
        }
        List<String> inlist = new ArrayList<>();

        for (String url : urlList){
            boolean b = ossClient.doesObjectExist(bucketName, url);
            if(b){
                 inlist.add(url);
                downloadFileOSS(bucketName,url);
                logger.info(" groupMem download avatar : "+url);
            }

        }
        return inlist;
    }

    /**
     *
     * @param bucketName
     * @param key
     */
    private void downloadFileOSS(String bucketName, String key)  {
        OSSObject ossObject = ossClient.getObject(bucketName, key);
        InputStream inputStream = ossObject.getObjectContent();

        //群成员头像本地缓存目录
        File directory = new File(OSSUtil.groupAvatarDir);
        if (!directory.exists()) {
            directory.mkdir();
        }
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            File file = new File(OSSUtil.groupAvatarDir+key);
            if (!file.exists()){
                file.createNewFile();
            }

            //获取文件流  使用高速缓存 + 数组复制 最大效率输出文件
            bis = new BufferedInputStream(inputStream);
            bos = new BufferedOutputStream(new FileOutputStream(file));
            int size;
            byte[] bytes = new byte[1024];
            while ((size = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, size);
            }
            bos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(bis!=null) {
                    bis.close();
                }
                if(bos!=null) {
                    bos.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }



    }


    /**
     * 合成群头像上传OSS
     * @param objectKey OSS群头像文件标识
     * @param composAvatarUrl 本地群头像文件地址
     */
    public void uploadOss(String objectKey, String composAvatarUrl) {
        ossClient.putObject(bucketName, objectKey, new File(composAvatarUrl));
    }
}
